Hệ thống quản lý phương tiện trong PHP

1 /*!
2  * sweetalert2 v6.
6.2
3  * Released under the MIT License.
4  */

5 (function (
global, factory) {
6     
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
7     
typeof define === 'function' && define.amd ? define(factory) :
8     (
global.Sweetalert2 = factory());
9 }(
this, (function () { 'use strict';
10
11 var
defaultParams = {
12   title:
'',
13   titleText:
'',
14   text:
'',
15   html:
'',
16   type:
null,
17   customClass:
'',
18   target:
'body',
19   animation:
true,
20   allowOutsideClick:
true,
21   allowEscapeKey:
true,
22   allowEnterKey:
true,
23   showConfirmButton:
true,
24   showCancelButton:
false,
25   preConfirm:
null,
26   confirmButtonText:
'OK',
27   confirmButtonColor:
'#3085d6',
28   confirmButtonClass:
null,
29   cancelButtonText:
'Cancel',
30   cancelButtonColor:
'#aaa',
31   cancelButtonClass:
null,
32   buttonsStyling:
true,
33   reverseButtons:
false,
34   focusCancel:
false,
35   showCloseButton:
false,
36   showLoaderOnConfirm:
false,
37   imageUrl:
null,
38   imageWidth:
null,
39   imageHeight:
null,
40   imageClass:
null,
41   timer:
null,
42   width:
500,
43   padding:
20,
44   background:
'#fff',
45   input:
null,
46   inputPlaceholder:
'',
47   inputValue:
'',
48   inputOptions: {},
49   inputAutoTrim:
true,
50   inputClass:
null,
51   inputAttributes: {},
52   inputValidator:
null,
53   progressSteps: [],
54   currentProgressStep:
null,
55   progressStepsDistance:
'40px',
56   onOpen:
null,
57   onClose:
null
58 };

59
60 var
swalPrefix = 'swal2-';
61
62 var
prefix = function prefix(items) {
63   
var result = {};
64   
for (var i in items) {
65     result[items[i]] = swalPrefix + items[i];
66   }
67   
return result;
68 };

69
70 var
swalClasses = prefix(['container', 'shown', 'iosfix', 'modal', 'overlay', 'fade', 'show', 'hide', 'noanimation', 'close', 'title', 'content', 'buttonswrapper', 'confirm', 'cancel', 'icon', 'image', 'input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea', 'inputerror', 'validationerror', 'progresssteps', 'activeprogressstep', 'progresscircle', 'progressline', 'loading', 'styled']);
71
72 var
iconTypes = prefix(['success', 'warning', 'info', 'question', 'error']);
73
74 /*
75  * Set hover, active and focus-states
for buttons (source: http://www.sitepoint.com/javascript-generate-lighter-darker-color)
76  */

77 var
colorLuminance = function colorLuminance(hex, lum) {
78   
// Validate hex string
79   hex = String(hex).replace(/[^
0-9a-f]/gi, '');
80   
if (hex.length < 6) {
81     hex = hex[
0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
82   }
83   lum = lum ||
0;
84
85   
// Convert to decimal and change luminosity
86   
var rgb = '#';
87   
for (var i = 0; i < 3; i++) {
88     
var c = parseInt(hex.substr(i * 2, 2), 16);
89     c = Math.round(Math.min(Math.max(
0, c + c * lum), 255)).toString(16);
90     rgb += (
'00' + c).substr(c.length);
91   }
92
93   
return rgb;
94 };

95
96 var
uniqueArray = function uniqueArray(arr) {
97   
var result = [];
98   
for (var i in arr) {
99     
if (result.indexOf(arr[i]) === -1) {
100       result.push(arr[i]);
101     }
102   }
103   
return result;
104 };

105
106 /*
global MouseEvent */
107
108 // Remember state
in cases where opening and handling a modal will fiddle with it.
109 var
states = {
110   previousWindowKeyDown:
null,
111   previousActiveElement:
null,
112   previousBodyPadding:
null
113 };

114
115 /*
116  * Add modal + overlay to DOM
117  */

118 var
init = function init(params) {
119   
if (typeof document === 'undefined') {
120     console.error(
'SweetAlert2 requires document to initialize');
121     
return;
122   }
123
124   
var container = document.createElement('div');
125   container.className = swalClasses.container;
126   container.innerHTML = sweetHTML;
127
128   
var targetElement = document.querySelector(params.target);
129   
if (!targetElement) {
130     console.warn(
'SweetAlert2: Can\'t find the target "' + params.target + '"');
131     targetElement = document.body;
132   }
133   targetElement.appendChild(container);
134
135   
var modal = getModal();
136   
var input = getChildByClass(modal, swalClasses.input);
137   
var file = getChildByClass(modal, swalClasses.file);
138   
var range = modal.querySelector('.' + swalClasses.range + ' input');
139   
var rangeOutput = modal.querySelector('.' + swalClasses.range + ' output');
140   
var select = getChildByClass(modal, swalClasses.select);
141   
var checkbox = modal.querySelector('.' + swalClasses.checkbox + ' input');
142   
var textarea = getChildByClass(modal, swalClasses.textarea);
143
144   input.oninput = function () {
145     sweetAlert.resetValidationError();
146   };
147
148   input.onkeydown = function (
event) {
149     setTimeout(function () {
150       
if (event.keyCode === 13 && params.allowEnterKey) {
151         
event.stopPropagation();
152         sweetAlert.clickConfirm();
153       }
154     },
0);
155   };
156
157   file.onchange = function () {
158     sweetAlert.resetValidationError();
159   };
160
161   range.oninput = function () {
162     sweetAlert.resetValidationError();
163     rangeOutput.
value = range.value;
164   };
165
166   range.onchange = function () {
167     sweetAlert.resetValidationError();
168     range.previousSibling.
value = range.value;
169   };
170
171   
select.onchange = function () {
172     sweetAlert.resetValidationError();
173   };
174
175   checkbox.onchange = function () {
176     sweetAlert.resetValidationError();
177   };
178
179   textarea.oninput = function () {
180     sweetAlert.resetValidationError();
181   };
182
183   
return modal;
184 };

185
186 /*
187  * Manipulate DOM
188  */

189
190 var
sweetHTML = ('\n <div role="dialog" aria-labelledby="' + swalClasses.title + '" aria-describedby="' + swalClasses.content + '" class="' + swalClasses.modal + '" tabindex="-1">\n <ul class="' + swalClasses.progresssteps + '"></ul>\n <div class="' + swalClasses.icon + ' ' + iconTypes.error + '">\n <span class="swal2-x-mark"><span class="swal2-x-mark-line-left"></span><span class="swal2-x-mark-line-right"></span></span>\n </div>\n <div class="' + swalClasses.icon + ' ' + iconTypes.question + '">?</div>\n <div class="' + swalClasses.icon + ' ' + iconTypes.warning + '">!</div>\n <div class="' + swalClasses.icon + ' ' + iconTypes.info + '">i</div>\n <div class="' + swalClasses.icon + ' ' + iconTypes.success + '">\n <div class="swal2-success-circular-line-left"></div>\n <span class="swal2-success-line-tip"></span> <span class="swal2-success-line-long"></span>\n <div class="swal2-success-ring"></div> <div class="swal2-success-fix"></div>\n <div class="swal2-success-circular-line-right"></div>\n </div>\n <img class="' + swalClasses.image + '">\n <h2 class="' + swalClasses.title + '" id="' + swalClasses.title + '"></h2>\n <div id="' + swalClasses.content + '" class="' + swalClasses.content + '"></div>\n <input class="' + swalClasses.input + '">\n <input type="file" class="' + swalClasses.file + '">\n <div class="' + swalClasses.range + '">\n <output></output>\n <input type="range">\n </div>\n <select class="' + swalClasses.select + '"></select>\n <div class="' + swalClasses.radio + '"></div>\n <label for="' + swalClasses.checkbox + '" class="' + swalClasses.checkbox + '">\n <input type="checkbox">\n </label>\n <textarea class="' + swalClasses.textarea + '"></textarea>\n <div class="' + swalClasses.validationerror + '"></div>\n <div class="' + swalClasses.buttonswrapper + '">\n <button type="button" class="' + swalClasses.confirm + '">OK</button>\n <button type="button" class="' + swalClasses.cancel + '">Cancel</button>\n </div>\n <button type="button" class="' + swalClasses.close + '" aria-label="Close this dialog">&times;</button>\n </div>\n').replace(/(^|\n)\s*/g, '');
191
192 var
getContainer = function getContainer() {
193   
return document.body.querySelector('.' + swalClasses.container);
194 };

195
196 var
getModal = function getModal() {
197   
return getContainer() ? getContainer().querySelector('.' + swalClasses.modal) : null;
198 };

199
200 var
getIcons = function getIcons() {
201   
var modal = getModal();
202   
return modal.querySelectorAll('.' + swalClasses.icon);
203 };

204
205 var
elementByClass = function elementByClass(className) {
206   
return getContainer() ? getContainer().querySelector('.' + className) : null;
207 };

208
209 var
getTitle = function getTitle() {
210   
return elementByClass(swalClasses.title);
211 };

212
213 var
getContent = function getContent() {
214   
return elementByClass(swalClasses.content);
215 };

216
217 var
getImage = function getImage() {
218   
return elementByClass(swalClasses.image);
219 };

220
221 var
getButtonsWrapper = function getButtonsWrapper() {
222   
return elementByClass(swalClasses.buttonswrapper);
223 };

224
225 var
getProgressSteps = function getProgressSteps() {
226   
return elementByClass(swalClasses.progresssteps);
227 };

228
229 var
getValidationError = function getValidationError() {
230   
return elementByClass(swalClasses.validationerror);
231 };

232
233 var
getConfirmButton = function getConfirmButton() {
234   
return elementByClass(swalClasses.confirm);
235 };

236
237 var
getCancelButton = function getCancelButton() {
238   
return elementByClass(swalClasses.cancel);
239 };

240
241 var
getCloseButton = function getCloseButton() {
242   
return elementByClass(swalClasses.close);
243 };

244
245 var
getFocusableElements = function getFocusableElements(focusCancel) {
246   
var buttons = [getConfirmButton(), getCancelButton()];
247   
if (focusCancel) {
248     buttons.reverse();
249   }
250   
var focusableElements = buttons.concat(Array.prototype.slice.call(getModal().querySelectorAll('button, input:not([type=hidden]), textarea, select, a, *[tabindex]:not([tabindex="-1"])')));
251   
return uniqueArray(focusableElements);
252 };

253
254 var
hasClass = function hasClass(elem, className) {
255   
if (elem.classList) {
256     
return elem.classList.contains(className);
257   }
258   
return false;
259 };

260
261 var
focusInput = function focusInput(input) {
262   input.focus();
263
264   
// place cursor at end of text in text input
265   
if (input.type !== 'file') {
266     
// http://stackoverflow.com/a/2345915/1331425
267     
var val = input.value;
268     input.
value = '';
269     input.
value = val;
270   }
271 };

272
273 var
addClass = function addClass(elem, className) {
274   
if (!elem || !className) {
275     
return;
276   }
277   
var classes = className.split(/\s+/).filter(Boolean);
278   classes.forEach(function (className) {
279     elem.classList.
add(className);
280   });
281 };

282
283 var
removeClass = function removeClass(elem, className) {
284   
if (!elem || !className) {
285     
return;
286   }
287   
var classes = className.split(/\s+/).filter(Boolean);
288   classes.forEach(function (className) {
289     elem.classList.
remove(className);
290   });
291 };

292
293 var
getChildByClass = function getChildByClass(elem, className) {
294   
for (var i = 0; i < elem.childNodes.length; i++) {
295     
if (hasClass(elem.childNodes[i], className)) {
296       
return elem.childNodes[i];
297     }
298   }
299 };

300
301 var
show = function show(elem, display) {
302   
if (!display) {
303     display =
'block';
304   }
305   elem.style.opacity =
'';
306   elem.style.display = display;
307 };

308
309 var
hide = function hide(elem) {
310   elem.style.opacity =
'';
311   elem.style.display =
'none';
312 };

313
314 var
empty = function empty(elem) {
315   
while (elem.firstChild) {
316     elem.removeChild(elem.firstChild);
317   }
318 };

319
320 // borrowed
from jqeury $(elem).is(':visible') implementation
321 var
isVisible = function isVisible(elem) {
322   
return elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length;
323 };

324
325 var
removeStyleProperty = function removeStyleProperty(elem, property) {
326   
if (elem.style.removeProperty) {
327     elem.style.removeProperty(property);
328   }
else {
329     elem.style.removeAttribute(property);
330   }
331 };

332
333 var
fireClick = function fireClick(node) {
334   
if (!isVisible(node)) {
335     
return false;
336   }
337
338   
// Taken from http://www.nonobtrusive.com/2011/11/29/programatically-fire-crossbrowser-click-event-with-javascript/
339   
// Then fixed for today's Chrome browser.
340   
if (typeof MouseEvent === 'function') {
341     
// Up-to-date approach
342     
var mevt = new MouseEvent('click', {
343       view: window,
344       bubbles:
false,
345       cancelable:
true
346     });
347     node.dispatchEvent(mevt);
348   }
else if (document.createEvent) {
349     
// Fallback
350     
var evt = document.createEvent('MouseEvents');
351     evt.initEvent(
'click', false, false);
352     node.dispatchEvent(evt);
353   }
else if (document.createEventObject) {
354     node.fireEvent(
'onclick');
355   }
else if (typeof node.onclick === 'function') {
356     node.onclick();
357   }
358 };

359
360 var
animationEndEvent = function () {
361   
var testEl = document.createElement('div');
362   
var transEndEventNames = {
363     
'WebkitAnimation': 'webkitAnimationEnd',
364     
'OAnimation': 'oAnimationEnd oanimationend',
365     
'msAnimation': 'MSAnimationEnd',
366     
'animation': 'animationend'
367   };
368   
for (var i in transEndEventNames) {
369     
if (transEndEventNames.hasOwnProperty(i) && testEl.style[i] !== undefined) {
370       
return transEndEventNames[i];
371     }
372   }
373
374   
return false;
375 }();

376
377 // Reset previous window keydown handler and focued element

378 var
resetPrevState = function resetPrevState() {
379   window.onkeydown = states.previousWindowKeyDown;
380   
if (states.previousActiveElement && states.previousActiveElement.focus) {
381     
var x = window.scrollX;
382     
var y = window.scrollY;
383     states.previousActiveElement.focus();
384     
if (x && y) {
385       
// IE has no scrollX/scrollY support
386       window.scrollTo(x, y);
387     }
388   }
389 };

390
391 // Measure width of scrollbar
392 // https://github.com/twbs/bootstrap/blob/master/js/modal.js#L279-L286

393 var
measureScrollbar = function measureScrollbar() {
394   
var supportsTouch = 'ontouchstart' in window || navigator.msMaxTouchPoints;
395   
if (supportsTouch) {
396     
return 0;
397   }
398   
var scrollDiv = document.createElement('div');
399   scrollDiv.style.width =
'50px';
400   scrollDiv.style.height =
'50px';
401   scrollDiv.style.overflow =
'scroll';
402   document.body.appendChild(scrollDiv);
403   
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
404   document.body.removeChild(scrollDiv);
405   
return scrollbarWidth;
406 };

407
408 // JavaScript Debounce Function
409 // Simplivied version of https://davidwalsh.name/javascript-debounce-function

410 var
debounce = function debounce(func, wait) {
411   
var timeout = void 0;
412   
return function () {
413     
var later = function later() {
414       timeout =
null;
415       func();
416     };
417     clearTimeout(timeout);
418     timeout = setTimeout(later, wait);
419   };
420 };

421
422 var
_typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
423   
return typeof obj;
424 } : function (obj) {
425   
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
426 };

427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448 var
_extends = Object.assign || function (target) {
449   
for (var i = 1; i < arguments.length; i++) {
450     
var source = arguments[i];
451
452     
for (var key in source) {
453       
if (Object.prototype.hasOwnProperty.call(source, key)) {
454         target[key] = source[key];
455       }
456     }
457   }
458
459   
return target;
460 };

461
462 var
modalParams = _extends({}, defaultParams);
463 var
queue = [];
464 var
swal2Observer = void 0;
465
466 /*
467  * Set type, text and actions
on modal
468  */

469 var
setParameters = function setParameters(params) {
470   
var modal = getModal() || init(params);
471
472   
for (var param in params) {
473     
if (!defaultParams.hasOwnProperty(param) && param !== 'extraParams') {
474       console.warn(
'SweetAlert2: Unknown parameter "' + param + '"');
475     }
476   }
477
478   
// Set modal width
479   modal.style.width =
typeof params.width === 'number' ? params.width + 'px' : params.width;
480
481   modal.style.padding =
params.padding + 'px';
482   modal.style.background =
params.background;
483   
var successIconParts = modal.querySelectorAll('[class^=swal2-success-circular-line], .swal2-success-fix');
484   
for (var i = 0; i < successIconParts.length; i++) {
485     successIconParts[i].style.background =
params.background;
486   }
487
488   
var title = getTitle();
489   
var content = getContent();
490   
var buttonsWrapper = getButtonsWrapper();
491   
var confirmButton = getConfirmButton();
492   
var cancelButton = getCancelButton();
493   
var closeButton = getCloseButton();
494
495   
// Title
496   
if (params.titleText) {
497     title.innerText =
params.titleText;
498   }
else {
499     title.innerHTML =
params.title.split('\n').join('<br>');
500   }
501
502   
// Content
503   
if (params.text || params.html) {
504     
if (_typeof(params.html) === 'object') {
505       content.innerHTML =
'';
506       
if (0 in params.html) {
507         
for (var _i = 0; _i in params.html; _i++) {
508           content.appendChild(
params.html[_i].cloneNode(true));
509         }
510       }
else {
511         content.appendChild(
params.html.cloneNode(true));
512       }
513     }
else if (params.html) {
514       content.innerHTML =
params.html;
515     }
else if (params.text) {
516       content.textContent =
params.text;
517     }
518     show(content);
519   }
else {
520     hide(content);
521   }
522
523   
// Close button
524   
if (params.showCloseButton) {
525     show(closeButton);
526   }
else {
527     hide(closeButton);
528   }
529
530   
// Custom Class
531   modal.className = swalClasses.modal;
532   
if (params.customClass) {
533     addClass(modal,
params.customClass);
534   }
535
536   
// Progress steps
537   
var progressStepsContainer = getProgressSteps();
538   
var currentProgressStep = parseInt(params.currentProgressStep === null ? sweetAlert.getQueueStep() : params.currentProgressStep, 10);
539   
if (params.progressSteps.length) {
540     show(progressStepsContainer);
541     empty(progressStepsContainer);
542     
if (currentProgressStep >= params.progressSteps.length) {
543       console.warn(
'SweetAlert2: Invalid currentProgressStep parameter, it should be less than progressSteps.length ' + '(currentProgressStep like JS arrays starts from 0)');
544     }
545     
params.progressSteps.forEach(function (step, index) {
546       
var circle = document.createElement('li');
547       addClass(circle, swalClasses.progresscircle);
548       circle.innerHTML = step;
549       
if (index === currentProgressStep) {
550         addClass(circle, swalClasses.activeprogressstep);
551       }
552       progressStepsContainer.appendChild(circle);
553       
if (index !== params.progressSteps.length - 1) {
554         
var line = document.createElement('li');
555         addClass(line, swalClasses.progressline);
556         line.style.width =
params.progressStepsDistance;
557         progressStepsContainer.appendChild(line);
558       }
559     });
560   }
else {
561     hide(progressStepsContainer);
562   }
563
564   
// Icon
565   
var icons = getIcons();
566   
for (var _i2 = 0; _i2 < icons.length; _i2++) {
567     hide(icons[_i2]);
568   }
569   
if (params.type) {
570     
var validType = false;
571     
for (var iconType in iconTypes) {
572       
if (params.type === iconType) {
573         validType =
true;
574         
break;
575       }
576     }
577     
if (!validType) {
578       console.error(
'SweetAlert2: Unknown alert type: ' + params.type);
579       
return false;
580     }
581     
var icon = modal.querySelector('.' + swalClasses.icon + '.' + iconTypes[params.type]);
582     show(icon);
583
584     
// Animate icon
585     
if (params.animation) {
586       
switch (params.type) {
587         
case 'success':
588           addClass(icon,
'swal2-animate-success-icon');
589           addClass(icon.querySelector(
'.swal2-success-line-tip'), 'swal2-animate-success-line-tip');
590           addClass(icon.querySelector(
'.swal2-success-line-long'), 'swal2-animate-success-line-long');
591           
break;
592         
case 'error':
593           addClass(icon,
'swal2-animate-error-icon');
594           addClass(icon.querySelector(
'.swal2-x-mark'), 'swal2-animate-x-mark');
595           
break;
596         
default:
597           
break;
598       }
599     }
600   }
601
602   
// Custom image
603   
var image = getImage();
604   
if (params.imageUrl) {
605     image.setAttribute(
'src', params.imageUrl);
606     show(image);
607
608     
if (params.imageWidth) {
609       image.setAttribute(
'width', params.imageWidth);
610     }
else {
611       image.removeAttribute(
'width');
612     }
613
614     
if (params.imageHeight) {
615       image.setAttribute(
'height', params.imageHeight);
616     }
else {
617       image.removeAttribute(
'height');
618     }
619
620     image.className = swalClasses.image;
621     
if (params.imageClass) {
622       addClass(image,
params.imageClass);
623     }
624   }
else {
625     hide(image);
626   }
627
628   
// Cancel button
629   
if (params.showCancelButton) {
630     cancelButton.style.display =
'inline-block';
631   }
else {
632     hide(cancelButton);
633   }
634
635   
// Confirm button
636   
if (params.showConfirmButton) {
637     removeStyleProperty(confirmButton,
'display');
638   }
else {
639     hide(confirmButton);
640   }
641
642   
// Buttons wrapper
643   
if (!params.showConfirmButton && !params.showCancelButton) {
644     hide(buttonsWrapper);
645   }
else {
646     show(buttonsWrapper);
647   }
648
649   
// Edit text on cancel and confirm buttons
650   confirmButton.innerHTML =
params.confirmButtonText;
651   cancelButton.innerHTML =
params.cancelButtonText;
652
653   
// Set buttons to selected background colors
654   
if (params.buttonsStyling) {
655     confirmButton.style.backgroundColor =
params.confirmButtonColor;
656     cancelButton.style.backgroundColor =
params.cancelButtonColor;
657   }
658
659   
// Add buttons custom classes
660   confirmButton.className = swalClasses.confirm;
661   addClass(confirmButton,
params.confirmButtonClass);
662   cancelButton.className = swalClasses.cancel;
663   addClass(cancelButton,
params.cancelButtonClass);
664
665   
// Buttons styling
666   
if (params.buttonsStyling) {
667     addClass(confirmButton, swalClasses.styled);
668     addClass(cancelButton, swalClasses.styled);
669   }
else {
670     removeClass(confirmButton, swalClasses.styled);
671     removeClass(cancelButton, swalClasses.styled);
672
673     confirmButton.style.backgroundColor = confirmButton.style.borderLeftColor = confirmButton.style.borderRightColor =
'';
674     cancelButton.style.backgroundColor = cancelButton.style.borderLeftColor = cancelButton.style.borderRightColor =
'';
675   }
676
677   
// CSS animation
678   
if (params.animation === true) {
679     removeClass(modal, swalClasses.noanimation);
680   }
else {
681     addClass(modal, swalClasses.noanimation);
682   }
683 };

684
685 /*
686  * Animations
687  */

688 var
openModal = function openModal(animation, onComplete) {
689   
var container = getContainer();
690   
var modal = getModal();
691
692   
if (animation) {
693     addClass(modal, swalClasses.show);
694     addClass(container, swalClasses.fade);
695     removeClass(modal, swalClasses.hide);
696   }
else {
697     removeClass(modal, swalClasses.fade);
698   }
699   show(modal);
700
701   
// scrolling is 'hidden' until animation is done, after that 'auto'
702   container.style.overflowY =
'hidden';
703   
if (animationEndEvent && !hasClass(modal, swalClasses.noanimation)) {
704     modal.addEventListener(animationEndEvent, function swalCloseEventFinished() {
705       modal.removeEventListener(animationEndEvent, swalCloseEventFinished);
706       container.style.overflowY =
'auto';
707     });
708   }
else {
709     container.style.overflowY =
'auto';
710   }
711
712   addClass(document.documentElement, swalClasses.shown);
713   addClass(document.body, swalClasses.shown);
714   addClass(container, swalClasses.shown);
715   fixScrollbar();
716   iOSfix();
717   states.previousActiveElement = document.activeElement;
718   
if (onComplete !== null && typeof onComplete === 'function') {
719     setTimeout(function () {
720       onComplete(modal);
721     });
722   }
723 };

724
725 var
fixScrollbar = function fixScrollbar() {
726   
// for queues, do not do this more than once
727   
if (states.previousBodyPadding !== null) {
728     
return;
729   }
730   
// if the body has overflow
731   
if (document.body.scrollHeight > window.innerHeight) {
732     
// add padding so the content doesn't shift after removal of scrollbar
733     states.previousBodyPadding = document.body.style.paddingRight;
734     document.body.style.paddingRight = measureScrollbar() +
'px';
735   }
736 };

737
738 var
undoScrollbar = function undoScrollbar() {
739   
if (states.previousBodyPadding !== null) {
740     document.body.style.paddingRight = states.previousBodyPadding;
741     states.previousBodyPadding =
null;
742   }
743 };

744
745 // Fix iOS scrolling http://stackoverflow.com/q/
39626302/1331425
746 var
iOSfix = function iOSfix() {
747   
var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
748   
if (iOS && !hasClass(document.body, swalClasses.iosfix)) {
749     
var offset = document.body.scrollTop;
750     document.body.style.top = offset * -
1 + 'px';
751     addClass(document.body, swalClasses.iosfix);
752   }
753 };

754
755 var
undoIOSfix = function undoIOSfix() {
756   
if (hasClass(document.body, swalClasses.iosfix)) {
757     
var offset = parseInt(document.body.style.top, 10);
758     removeClass(document.body, swalClasses.iosfix);
759     document.body.style.top =
'';
760     document.body.scrollTop = offset * -
1;
761   }
762 };

763
764 // SweetAlert entry point

765 var
sweetAlert = function sweetAlert() {
766   
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
767     args[_key] = arguments[_key];
768   }
769
770   
if (args[0] === undefined) {
771     console.error(
'SweetAlert2 expects at least 1 attribute!');
772     
return false;
773   }
774
775   
var params = _extends({}, modalParams);
776
777   
switch (_typeof(args[0])) {
778     
case 'string':
779       
params.title = args[0];
780       
params.html = args[1];
781       
params.type = args[2];
782
783       
break;
784
785     
case 'object':
786       _extends(
params, args[0]);
787       
params.extraParams = args[0].extraParams;
788
789       
if (params.input === 'email' && params.inputValidator === null) {
790         
params.inputValidator = function (email) {
791           
return new Promise(function (resolve, reject) {
792             
var emailRegex = /^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/;
793             
if (emailRegex.test(email)) {
794               resolve();
795             }
else {
796               reject(
'Invalid email address');
797             }
798           });
799         };
800       }
801
802       
if (params.input === 'url' && params.inputValidator === null) {
803         
params.inputValidator = function (url) {
804           
return new Promise(function (resolve, reject) {
805             
var urlRegex = /^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/;
806             
if (urlRegex.test(url)) {
807               resolve();
808             }
else {
809               reject(
'Invalid URL');
810             }
811           });
812         };
813       }
814       
break;
815
816     
default:
817       console.error(
'SweetAlert2: Unexpected type of argument! Expected "string" or "object", got ' + _typeof(args[0]));
818       
return false;
819   }
820
821   setParameters(
params);
822
823   
var container = getContainer();
824   
var modal = getModal();
825
826   
return new Promise(function (resolve, reject) {
827     
// Close on timer
828     
if (params.timer) {
829       modal.timeout = setTimeout(function () {
830         sweetAlert.closeModal(
params.onClose);
831         reject(
'timer');
832       },
params.timer);
833     }
834
835     
// Get input element by specified type or, if type isn't specified, by params.input
836     
var getInput = function getInput(inputType) {
837       inputType = inputType ||
params.input;
838       
if (!inputType) {
839         
return null;
840       }
841       
switch (inputType) {
842         
case 'select':
843         
case 'textarea':
844         
case 'file':
845           
return getChildByClass(modal, swalClasses[inputType]);
846         
case 'checkbox':
847           
return modal.querySelector('.' + swalClasses.checkbox + ' input');
848         
case 'radio':
849           
return modal.querySelector('.' + swalClasses.radio + ' input:checked') || modal.querySelector('.' + swalClasses.radio + ' input:first-child');
850         
case 'range':
851           
return modal.querySelector('.' + swalClasses.range + ' input');
852         
default:
853           
return getChildByClass(modal, swalClasses.input);
854       }
855     };
856
857     
// Get the value of the modal input
858     
var getInputValue = function getInputValue() {
859       
var input = getInput();
860       
if (!input) {
861         
return null;
862       }
863       
switch (params.input) {
864         
case 'checkbox':
865           
return input.checked ? 1 : 0;
866         
case 'radio':
867           
return input.checked ? input.value : null;
868         
case 'file':
869           
return input.files.length ? input.files[0] : null;
870         
default:
871           
return params.inputAutoTrim ? input.value.trim() : input.value;
872       }
873     };
874
875     
// input autofocus
876     
if (params.input) {
877       setTimeout(function () {
878         
var input = getInput();
879         
if (input) {
880           focusInput(input);
881         }
882       },
0);
883     }
884
885     
var confirm = function confirm(value) {
886       
if (params.showLoaderOnConfirm) {
887         sweetAlert.showLoading();
888       }
889
890       
if (params.preConfirm) {
891         
params.preConfirm(value, params.extraParams).then(function (preConfirmValue) {
892           sweetAlert.closeModal(
params.onClose);
893           resolve(preConfirmValue ||
value);
894         }, function (error) {
895           sweetAlert.hideLoading();
896           
if (error) {
897             sweetAlert.showValidationError(error);
898           }
899         });
900       }
else {
901         sweetAlert.closeModal(
params.onClose);
902         resolve(
value);
903       }
904     };
905
906     
// Mouse interactions
907     
var onButtonEvent = function onButtonEvent(event) {
908       
var e = event || window.event;
909       
var target = e.target || e.srcElement;
910       
var confirmButton = getConfirmButton();
911       
var cancelButton = getCancelButton();
912       
var targetedConfirm = confirmButton && (confirmButton === target || confirmButton.contains(target));
913       
var targetedCancel = cancelButton && (cancelButton === target || cancelButton.contains(target));
914
915       
switch (e.type) {
916         
case 'mouseover':
917         
case 'mouseup':
918           
if (params.buttonsStyling) {
919             
if (targetedConfirm) {
920               confirmButton.style.backgroundColor = colorLuminance(
params.confirmButtonColor, -0.1);
921             }
else if (targetedCancel) {
922               cancelButton.style.backgroundColor = colorLuminance(
params.cancelButtonColor, -0.1);
923             }
924           }
925           
break;
926         
case 'mouseout':
927           
if (params.buttonsStyling) {
928             
if (targetedConfirm) {
929               confirmButton.style.backgroundColor =
params.confirmButtonColor;
930             }
else if (targetedCancel) {
931               cancelButton.style.backgroundColor =
params.cancelButtonColor;
932             }
933           }
934           
break;
935         
case 'mousedown':
936           
if (params.buttonsStyling) {
937             
if (targetedConfirm) {
938               confirmButton.style.backgroundColor = colorLuminance(
params.confirmButtonColor, -0.2);
939             }
else if (targetedCancel) {
940               cancelButton.style.backgroundColor = colorLuminance(
params.cancelButtonColor, -0.2);
941             }
942           }
943           
break;
944         
case 'click':
945           
// Clicked 'confirm'
946           
if (targetedConfirm && sweetAlert.isVisible()) {
947             sweetAlert.disableButtons();
948             
if (params.input) {
949               
var inputValue = getInputValue();
950
951               
if (params.inputValidator) {
952                 sweetAlert.disableInput();
953                 
params.inputValidator(inputValue, params.extraParams).then(function () {
954                   sweetAlert.enableButtons();
955                   sweetAlert.enableInput();
956                   confirm(inputValue);
957                 }, function (error) {
958                   sweetAlert.enableButtons();
959                   sweetAlert.enableInput();
960                   
if (error) {
961                     sweetAlert.showValidationError(error);
962                   }
963                 });
964               }
else {
965                 confirm(inputValue);
966               }
967             }
else {
968               confirm(
true);
969             }
970
971             
// Clicked 'cancel'
972           }
else if (targetedCancel && sweetAlert.isVisible()) {
973             sweetAlert.disableButtons();
974             sweetAlert.closeModal(
params.onClose);
975             reject(
'cancel');
976           }
977           
break;
978         
default:
979       }
980     };
981
982     
var buttons = modal.querySelectorAll('button');
983     
for (var i = 0; i < buttons.length; i++) {
984       buttons[i].onclick = onButtonEvent;
985       buttons[i].onmouseover = onButtonEvent;
986       buttons[i].onmouseout = onButtonEvent;
987       buttons[i].onmousedown = onButtonEvent;
988     }
989
990     
// Closing modal by close button
991     getCloseButton().onclick = function () {
992       sweetAlert.closeModal(
params.onClose);
993       reject(
'close');
994     };
995
996     
// Closing modal by overlay click
997     container.onclick = function (e) {
998       
if (e.target !== container) {
999         
return;
1000       }
1001       
if (params.allowOutsideClick) {
1002         sweetAlert.closeModal(
params.onClose);
1003         reject(
'overlay');
1004       }
1005     };
1006
1007     
var buttonsWrapper = getButtonsWrapper();
1008     
var confirmButton = getConfirmButton();
1009     
var cancelButton = getCancelButton();
1010
1011     
// Reverse buttons (Confirm on the right side)
1012     
if (params.reverseButtons) {
1013       confirmButton.parentNode.insertBefore(cancelButton, confirmButton);
1014     }
else {
1015       confirmButton.parentNode.insertBefore(confirmButton, cancelButton);
1016     }
1017
1018     
// Focus handling
1019     
var setFocus = function setFocus(index, increment) {
1020       
var focusableElements = getFocusableElements(params.focusCancel);
1021       
// search for visible elements and select the next possible match
1022       
for (var _i3 = 0; _i3 < focusableElements.length; _i3++) {
1023         index = index + increment;
1024
1025         
// rollover to first item
1026         
if (index === focusableElements.length) {
1027           index =
0;
1028
1029           
// go to last item
1030         }
else if (index === -1) {
1031           index = focusableElements.length -
1;
1032         }
1033
1034         
// determine if element is visible
1035         
var el = focusableElements[index];
1036         
if (isVisible(el)) {
1037           
return el.focus();
1038         }
1039       }
1040     };
1041
1042     
var handleKeyDown = function handleKeyDown(event) {
1043       
var e = event || window.event;
1044       
var keyCode = e.keyCode || e.which;
1045
1046       
if ([9, 13, 32, 27, 37, 38, 39, 40].indexOf(keyCode) === -1) {
1047         
// Don't do work on keys we don't care about.
1048         
return;
1049       }
1050
1051       
var targetElement = e.target || e.srcElement;
1052
1053       
var focusableElements = getFocusableElements(params.focusCancel);
1054       
var btnIndex = -1; // Find the button - note, this is a nodelist, not an array.
1055       
for (var _i4 = 0; _i4 < focusableElements.length; _i4++) {
1056         
if (targetElement === focusableElements[_i4]) {
1057           btnIndex = _i4;
1058           
break;
1059         }
1060       }
1061
1062       
// TAB
1063       
if (keyCode === 9) {
1064         
if (!e.shiftKey) {
1065           
// Cycle to the next button
1066           setFocus(btnIndex,
1);
1067         }
else {
1068           
// Cycle to the prev button
1069           setFocus(btnIndex, -
1);
1070         }
1071         e.stopPropagation();
1072         e.preventDefault();
1073
1074         
// ARROWS - switch focus between buttons
1075       }
else if (keyCode === 37 || keyCode === 38 || keyCode === 39 || keyCode === 40) {
1076         
// focus Cancel button if Confirm button is currently focused
1077         
if (document.activeElement === confirmButton && isVisible(cancelButton)) {
1078           cancelButton.focus();
1079           
// and vice versa
1080         }
else if (document.activeElement === cancelButton && isVisible(confirmButton)) {
1081           confirmButton.focus();
1082         }
1083
1084         
// ENTER/SPACE
1085       }
else if (keyCode === 13 || keyCode === 32) {
1086         
if (btnIndex === -1 && params.allowEnterKey) {
1087           
// ENTER/SPACE clicked outside of a button.
1088           
if (params.focusCancel) {
1089             fireClick(cancelButton, e);
1090           }
else {
1091             fireClick(confirmButton, e);
1092           }
1093           e.stopPropagation();
1094           e.preventDefault();
1095         }
1096
1097         
// ESC
1098       }
else if (keyCode === 27 && params.allowEscapeKey === true) {
1099         sweetAlert.closeModal(
params.onClose);
1100         reject(
'esc');
1101       }
1102     };
1103
1104     states.previousWindowKeyDown = window.onkeydown;
1105     window.onkeydown = handleKeyDown;
1106
1107     
// Loading state
1108     
if (params.buttonsStyling) {
1109       confirmButton.style.borderLeftColor =
params.confirmButtonColor;
1110       confirmButton.style.borderRightColor =
params.confirmButtonColor;
1111     }
1112
1113     
/**
1114      * Show spinner instead of Confirm button and disable Cancel button
1115      */

1116     sweetAlert.showLoading = sweetAlert.enableLoading = function () {
1117       show(buttonsWrapper);
1118       show(confirmButton,
'inline-block');
1119       addClass(buttonsWrapper, swalClasses.loading);
1120       addClass(modal, swalClasses.loading);
1121       confirmButton.disabled =
true;
1122       cancelButton.disabled =
true;
1123     };
1124
1125     
/**
1126      * Show spinner instead of Confirm button and disable Cancel button
1127      */

1128     sweetAlert.hideLoading = sweetAlert.disableLoading = function () {
1129       
if (!params.showConfirmButton) {
1130         hide(confirmButton);
1131         
if (!params.showCancelButton) {
1132           hide(getButtonsWrapper());
1133         }
1134       }
1135       removeClass(buttonsWrapper, swalClasses.loading);
1136       removeClass(modal, swalClasses.loading);
1137       confirmButton.disabled =
false;
1138       cancelButton.disabled =
false;
1139     };
1140
1141     sweetAlert.getTitle = function () {
1142       
return getTitle();
1143     };
1144     sweetAlert.getContent = function () {
1145       
return getContent();
1146     };
1147     sweetAlert.getInput = function () {
1148       
return getInput();
1149     };
1150     sweetAlert.getImage = function () {
1151       
return getImage();
1152     };
1153     sweetAlert.getButtonsWrapper = function () {
1154       
return getButtonsWrapper();
1155     };
1156     sweetAlert.getConfirmButton = function () {
1157       
return getConfirmButton();
1158     };
1159     sweetAlert.getCancelButton = function () {
1160       
return getCancelButton();
1161     };
1162
1163     sweetAlert.enableButtons = function () {
1164       confirmButton.disabled =
false;
1165       cancelButton.disabled =
false;
1166     };
1167
1168     sweetAlert.disableButtons = function () {
1169       confirmButton.disabled =
true;
1170       cancelButton.disabled =
true;
1171     };
1172
1173     sweetAlert.enableConfirmButton = function () {
1174       confirmButton.disabled =
false;
1175     };
1176
1177     sweetAlert.disableConfirmButton = function () {
1178       confirmButton.disabled =
true;
1179     };
1180
1181     sweetAlert.enableInput = function () {
1182       
var input = getInput();
1183       
if (!input) {
1184         
return false;
1185       }
1186       
if (input.type === 'radio') {
1187         
var radiosContainer = input.parentNode.parentNode;
1188         
var radios = radiosContainer.querySelectorAll('input');
1189         
for (var _i5 = 0; _i5 < radios.length; _i5++) {
1190           radios[_i5].disabled =
false;
1191         }
1192       }
else {
1193         input.disabled =
false;
1194       }
1195     };
1196
1197     sweetAlert.disableInput = function () {
1198       
var input = getInput();
1199       
if (!input) {
1200         
return false;
1201       }
1202       
if (input && input.type === 'radio') {
1203         
var radiosContainer = input.parentNode.parentNode;
1204         
var radios = radiosContainer.querySelectorAll('input');
1205         
for (var _i6 = 0; _i6 < radios.length; _i6++) {
1206           radios[_i6].disabled =
true;
1207         }
1208       }
else {
1209         input.disabled =
true;
1210       }
1211     };
1212
1213     
// Set modal min-height to disable scrolling inside the modal
1214     sweetAlert.recalculateHeight = debounce(function () {
1215       
var modal = getModal();
1216       
if (!modal) {
1217         
return;
1218       }
1219       
var prevState = modal.style.display;
1220       modal.style.minHeight =
'';
1221       show(modal);
1222       modal.style.minHeight = modal.scrollHeight +
1 + 'px';
1223       modal.style.display = prevState;
1224     },
50);
1225
1226     
// Show block with validation error
1227     sweetAlert.showValidationError = function (error) {
1228       
var validationError = getValidationError();
1229       validationError.innerHTML = error;
1230       show(validationError);
1231
1232       
var input = getInput();
1233       
if (input) {
1234         focusInput(input);
1235         addClass(input, swalClasses.inputerror);
1236       }
1237     };
1238
1239     
// Hide block with validation error
1240     sweetAlert.resetValidationError = function () {
1241       
var validationError = getValidationError();
1242       hide(validationError);
1243       sweetAlert.recalculateHeight();
1244
1245       
var input = getInput();
1246       
if (input) {
1247         removeClass(input, swalClasses.inputerror);
1248       }
1249     };
1250
1251     sweetAlert.getProgressSteps = function () {
1252       
return params.progressSteps;
1253     };
1254
1255     sweetAlert.setProgressSteps = function (progressSteps) {
1256       
params.progressSteps = progressSteps;
1257       setParameters(
params);
1258     };
1259
1260     sweetAlert.showProgressSteps = function () {
1261       show(getProgressSteps());
1262     };
1263
1264     sweetAlert.hideProgressSteps = function () {
1265       hide(getProgressSteps());
1266     };
1267
1268     sweetAlert.enableButtons();
1269     sweetAlert.hideLoading();
1270     sweetAlert.resetValidationError();
1271
1272     
// inputs
1273     
var inputTypes = ['input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea'];
1274     
var input = void 0;
1275     
for (var _i7 = 0; _i7 < inputTypes.length; _i7++) {
1276       
var inputClass = swalClasses[inputTypes[_i7]];
1277       
var inputContainer = getChildByClass(modal, inputClass);
1278       input = getInput(inputTypes[_i7]);
1279
1280       
// set attributes
1281       
if (input) {
1282         
for (var j in input.attributes) {
1283           
if (input.attributes.hasOwnProperty(j)) {
1284             
var attrName = input.attributes[j].name;
1285             
if (attrName !== 'type' && attrName !== 'value') {
1286               input.removeAttribute(attrName);
1287             }
1288           }
1289         }
1290         
for (var attr in params.inputAttributes) {
1291           input.setAttribute(attr,
params.inputAttributes[attr]);
1292         }
1293       }
1294
1295       
// set class
1296       
inputContainer.className = inputClass;
1297       
if (params.inputClass) {
1298         addClass(inputContainer,
params.inputClass);
1299       }
1300
1301       hide(inputContainer);
1302     }
1303
1304     
var populateInputOptions = void 0;
1305     
switch (params.input) {
1306       
case 'text':
1307       
case 'email':
1308       
case 'password':
1309       
case 'number':
1310       
case 'tel':
1311       
case 'url':
1312         input = getChildByClass(modal, swalClasses.input);
1313         input.
value = params.inputValue;
1314         input.placeholder =
params.inputPlaceholder;
1315         input.type =
params.input;
1316         show(input);
1317         
break;
1318       
case 'file':
1319         input = getChildByClass(modal, swalClasses.file);
1320         input.placeholder =
params.inputPlaceholder;
1321         input.type =
params.input;
1322         show(input);
1323         
break;
1324       
case 'range':
1325         
var range = getChildByClass(modal, swalClasses.range);
1326         
var rangeInput = range.querySelector('input');
1327         
var rangeOutput = range.querySelector('output');
1328         rangeInput.
value = params.inputValue;
1329         rangeInput.type =
params.input;
1330         rangeOutput.
value = params.inputValue;
1331         show(range);
1332         
break;
1333       
case 'select':
1334         
var select = getChildByClass(modal, swalClasses.select);
1335         
select.innerHTML = '';
1336         
if (params.inputPlaceholder) {
1337           
var placeholder = document.createElement('option');
1338           placeholder.innerHTML =
params.inputPlaceholder;
1339           placeholder.
value = '';
1340           placeholder.disabled =
true;
1341           placeholder.selected =
true;
1342           
select.appendChild(placeholder);
1343         }
1344         populateInputOptions = function populateInputOptions(inputOptions) {
1345           
for (var optionValue in inputOptions) {
1346             
var option = document.createElement('option');
1347             option.
value = optionValue;
1348             option.innerHTML = inputOptions[optionValue];
1349             
if (params.inputValue === optionValue) {
1350               option.selected =
true;
1351             }
1352             
select.appendChild(option);
1353           }
1354           show(
select);
1355           
select.focus();
1356         };
1357         
break;
1358       
case 'radio':
1359         
var radio = getChildByClass(modal, swalClasses.radio);
1360         radio.innerHTML =
'';
1361         populateInputOptions = function populateInputOptions(inputOptions) {
1362           
for (var radioValue in inputOptions) {
1363             
var radioInput = document.createElement('input');
1364             
var radioLabel = document.createElement('label');
1365             
var radioLabelSpan = document.createElement('span');
1366             radioInput.type =
'radio';
1367             radioInput.name = swalClasses.radio;
1368             radioInput.
value = radioValue;
1369             
if (params.inputValue === radioValue) {
1370               radioInput.
checked = true;
1371             }
1372             radioLabelSpan.innerHTML = inputOptions[radioValue];
1373             radioLabel.appendChild(radioInput);
1374             radioLabel.appendChild(radioLabelSpan);
1375             radioLabel.
for = radioInput.id;
1376             radio.appendChild(radioLabel);
1377           }
1378           show(radio);
1379           
var radios = radio.querySelectorAll('input');
1380           
if (radios.length) {
1381             radios[
0].focus();
1382           }
1383         };
1384         
break;
1385       
case 'checkbox':
1386         
var checkbox = getChildByClass(modal, swalClasses.checkbox);
1387         
var checkboxInput = getInput('checkbox');
1388         checkboxInput.type =
'checkbox';
1389         checkboxInput.
value = 1;
1390         checkboxInput.id = swalClasses.checkbox;
1391         checkboxInput.
checked = Boolean(params.inputValue);
1392         
var label = checkbox.getElementsByTagName('span');
1393         
if (label.length) {
1394           checkbox.removeChild(label[
0]);
1395         }
1396         label = document.createElement(
'span');
1397         label.innerHTML =
params.inputPlaceholder;
1398         checkbox.appendChild(label);
1399         show(checkbox);
1400         
break;
1401       
case 'textarea':
1402         
var textarea = getChildByClass(modal, swalClasses.textarea);
1403         textarea.
value = params.inputValue;
1404         textarea.placeholder =
params.inputPlaceholder;
1405         show(textarea);
1406         
break;
1407       
case null:
1408         
break;
1409       
default:
1410         console.error(
'SweetAlert2: Unexpected type of input! Expected "text", "email", "password", "number", "tel", "select", "radio", "checkbox", "textarea", "file" or "url", got "' + params.input + '"');
1411         
break;
1412     }
1413
1414     
if (params.input === 'select' || params.input === 'radio') {
1415       
if (params.inputOptions instanceof Promise) {
1416         sweetAlert.showLoading();
1417         
params.inputOptions.then(function (inputOptions) {
1418           sweetAlert.hideLoading();
1419           populateInputOptions(inputOptions);
1420         });
1421       }
else if (_typeof(params.inputOptions) === 'object') {
1422         populateInputOptions(
params.inputOptions);
1423       }
else {
1424         console.error(
'SweetAlert2: Unexpected type of inputOptions! Expected object or Promise, got ' + _typeof(params.inputOptions));
1425       }
1426     }
1427
1428     openModal(
params.animation, params.onOpen);
1429
1430     
// Focus the first element (input or button)
1431     
if (params.allowEnterKey) {
1432       setFocus(-
1, 1);
1433     }
else {
1434       
if (document.activeElement) {
1435         document.activeElement.blur();
1436       }
1437     }
1438
1439     
// fix scroll
1440     getContainer().scrollTop =
0;
1441
1442     
// Observe changes inside the modal and adjust height
1443     
if (typeof MutationObserver !== 'undefined' && !swal2Observer) {
1444       swal2Observer =
new MutationObserver(sweetAlert.recalculateHeight);
1445       swal2Observer.observe(modal, { childList:
true, characterData: true, subtree: true });
1446     }
1447   });
1448 };

1449
1450 /*
1451  * Global function to determine
if swal2 modal is shown
1452  */

1453 sweetAlert.isVisible = function () {
1454   
return !!getModal();
1455 };

1456
1457 /*
1458  * Global function
for chaining sweetAlert modals
1459  */

1460 sweetAlert.queue = function (steps) {
1461   queue = steps;
1462   
var resetQueue = function resetQueue() {
1463     queue = [];
1464     document.body.removeAttribute(
'data-swal2-queue-step');
1465   };
1466   
var queueResult = [];
1467   
return new Promise(function (resolve, reject) {
1468     (function step(i, callback) {
1469       
if (i < queue.length) {
1470         document.body.setAttribute(
'data-swal2-queue-step', i);
1471
1472         sweetAlert(queue[i]).then(function (result) {
1473           queueResult.push(result);
1474           step(i +
1, callback);
1475         }, function (dismiss) {
1476           resetQueue();
1477           reject(dismiss);
1478         });
1479       }
else {
1480         resetQueue();
1481         resolve(queueResult);
1482       }
1483     })(
0);
1484   });
1485 };

1486
1487 /*
1488  * Global function
for getting the index of current modal in queue
1489  */

1490 sweetAlert.getQueueStep = function () {
1491   
return document.body.getAttribute('data-swal2-queue-step');
1492 };

1493
1494 /*
1495  * Global function
for inserting a modal to the queue
1496  */

1497 sweetAlert.insertQueueStep = function (step, index) {
1498   
if (index && index < queue.length) {
1499     
return queue.splice(index, 0, step);
1500   }
1501   
return queue.push(step);
1502 };

1503
1504 /*
1505  * Global function
for deleting a modal from the queue
1506  */

1507 sweetAlert.deleteQueueStep = function (index) {
1508   
if (typeof queue[index] !== 'undefined') {
1509     queue.splice(index,
1);
1510   }
1511 };

1512
1513 /*
1514  * Global function to close sweetAlert
1515  */

1516 sweetAlert.close = sweetAlert.closeModal = function (onComplete) {
1517   
var container = getContainer();
1518   
var modal = getModal();
1519   
if (!modal) {
1520     
return;
1521   }
1522   removeClass(modal, swalClasses.show);
1523   addClass(modal, swalClasses.hide);
1524   clearTimeout(modal.timeout);
1525
1526   resetPrevState();
1527
1528   
var removeModalAndResetState = function removeModalAndResetState() {
1529     
if (container.parentNode) {
1530       container.parentNode.removeChild(container);
1531     }
1532     removeClass(document.documentElement, swalClasses.shown);
1533     removeClass(document.body, swalClasses.shown);
1534     undoScrollbar();
1535     undoIOSfix();
1536   };
1537
1538   
// If animation is supported, animate
1539   
if (animationEndEvent && !hasClass(modal, swalClasses.noanimation)) {
1540     modal.addEventListener(animationEndEvent, function swalCloseEventFinished() {
1541       modal.removeEventListener(animationEndEvent, swalCloseEventFinished);
1542       
if (hasClass(modal, swalClasses.hide)) {
1543         removeModalAndResetState();
1544       }
1545     });
1546   }
else {
1547     
// Otherwise, remove immediately
1548     removeModalAndResetState();
1549   }
1550   
if (onComplete !== null && typeof onComplete === 'function') {
1551     setTimeout(function () {
1552       onComplete(modal);
1553     });
1554   }
1555 };

1556
1557 /*
1558  * Global function to click
'Confirm' button
1559  */

1560 sweetAlert.clickConfirm = function () {
1561   
return getConfirmButton().click();
1562 };

1563
1564 /*
1565  * Global function to click
'Cancel' button
1566  */

1567 sweetAlert.clickCancel = function () {
1568   
return getCancelButton().click();
1569 };

1570
1571 /**
1572  * Set
default params for each popup
1573  * @param {Object} userParams
1574  */

1575 sweetAlert.setDefaults = function (userParams) {
1576   
if (!userParams || (typeof userParams === 'undefined' ? 'undefined' : _typeof(userParams)) !== 'object') {
1577     
return console.error('SweetAlert2: the argument for setDefaults() is required and has to be a object');
1578   }
1579
1580   
for (var param in userParams) {
1581     
if (!defaultParams.hasOwnProperty(param) && param !== 'extraParams') {
1582       console.warn(
'SweetAlert2: Unknown parameter "' + param + '"');
1583       delete userParams[param];
1584     }
1585   }
1586
1587   _extends(modalParams, userParams);
1588 };

1589
1590 /**
1591  * Reset
default params for each popup
1592  */

1593 sweetAlert.resetDefaults = function () {
1594   modalParams = _extends({}, defaultParams);
1595 };
1596
1597 sweetAlert.noop = function () {};
1598
1599 sweetAlert.version =
'6.6.2';
1600
1601 sweetAlert.
default = sweetAlert;
1602
1603 return
sweetAlert;
1604
1605 })));

1606 if
(window.Sweetalert2) window.sweetAlert = window.swal = window.Sweetalert2;


Gõ tìm kiếm nhanh...